﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using estudent.Models;
using System.Text.RegularExpressions;
using System.Globalization;

namespace estudent.Controllers
{
    public class VnosPrijavnicaController : Controller
    {
        estudentEnt db = null;

        //
        // GET: /VnosPrijavnica/

        public ActionResult Index()
        {
            ViewData["navodilo"] = "Poiščite študenta, kateremu želite vpisati oceno s prijavnice.";
            ViewData["namen"] = "vpisovanjeSPrijavnice";

            return View("IskanjeStudent");
        }

        public ActionResult Predmeti(string id)
        {
            db = new estudentEnt();

            var predmeti = (from p in db.sPredmetis
                           from r in p.Vpisis
                           where r.username == id
                           orderby p.imePredmeta
                           select p).Distinct();


            string vloga = Session["role"].ToString();

            if (vloga.CompareTo("prof") == 0)
            {
                int sifraProf = Int32.Parse(Session["name"].ToString());

                var predmetiProf = db.Poucujes
                .Where(p => p.sProfesor1 == sifraProf || p.sProfesor2 == sifraProf || p.sProfesor3 == sifraProf)
                .OrderBy(p => p.sPredmeti.imePredmeta)
                .Select(p => p.sPredmeti)
                .Distinct();

                var koncno = predmeti.Intersect(predmetiProf);

                ViewData["profesor"] = sifraProf;
                ViewData["predmeti"] = koncno;
                ViewData["student"] = id;

                return View("VnosPrijavnicaProf");
            }

            ViewData["predmeti"] = predmeti;
            ViewData["student"] = id;


            return View("VnosPrijavnica");
        }


        [AcceptVerbs(HttpVerbs.Post)]
        public string PreveriPrijave(FormCollection form)
        {
            DateTime zacetek, konec;
            int sifraPred = Int32.Parse(form["predmet"]);
            string student = form["student"];
            string izhod = "";
            db = new estudentEnt();

            if (DateTime.Today.Month >= 10 && DateTime.Today.Month <= 12)
            {
                zacetek = new DateTime(DateTime.Today.Year, 10, 1);
                konec = new DateTime(DateTime.Today.Year + 1, 9, 30);
            }
            else
            {
                zacetek = new DateTime(DateTime.Today.Year - 1, 10, 1);
                konec = new DateTime(DateTime.Today.Year, 9, 30);
            }

            var prijav = db.PrijaveNaIzpits
                .Where(p => p.IzpitniRoki.Poucuje.sPredmeta == sifraPred)
                .Where(p => p.Vpisi.username == student)
                .Where(p => p.datumRoka >= zacetek && p.datumRoka <= konec)
                .GroupBy(p => new { p.Vpisi.username })
                .Select(p => new { vpisov = p.Count() })
                .FirstOrDefault();

            var vseh = db.PrijaveNaIzpits
                .Where(p => p.IzpitniRoki.Poucuje.sPredmeta == sifraPred)
                .Where(p => p.Vpisi.username == student)
                .GroupBy(p => new { p.Vpisi.username })
                .Select(p => new { vpisov = p.Count() })
                .FirstOrDefault();

            if (vseh != null)
                izhod += "Vseh prijav na ta izpit je " + vseh.vpisov + ". ";
            else
                izhod += "Ni prijav na ta izpit.";

            if (prijav != null)
                izhod += "Letos se je študent " + prijav.vpisov + "-krat prijavil na ta izpit.";

            return izhod;
        }


        [AcceptVerbs(HttpVerbs.Post)]
        public string PoisciProfesorje(FormCollection form)
        {
            db = new estudentEnt();
            int predmet = Int32.Parse(form["predmet"]);

            var profesor = db.Poucujes
                .Where(p => p.sPredmeta == predmet);

            string izhod = "<option value=\"prazen\">Izberite profesorja/e</option>";
            foreach (var ele in profesor)
            {
                string prof = db.SProfesorjis.First(k => k.sProfesor == ele.sProfesor1).priimekProfesor + " " + db.SProfesorjis.First(k => k.sProfesor == ele.sProfesor1).imeProfesor;
                if (ele.sProfesor2 != null)
                {
                    prof += ", ";
                    prof += db.SProfesorjis.First(k => k.sProfesor == ele.sProfesor2).priimekProfesor + " " + db.SProfesorjis.First(k => k.sProfesor == ele.sProfesor2).imeProfesor;
                }
                if (ele.sProfesor3 != null)
                {
                    prof += ", ";
                    prof += db.SProfesorjis.First(k => k.sProfesor == ele.sProfesor3).priimekProfesor + " " + db.SProfesorjis.First(k => k.sProfesor == ele.sProfesor3).imeProfesor;
                }
                izhod += ("<option value=\"" + ele.idPoucuje + "\">" + prof + "</option>");
            }

            return izhod;
        }

        [AcceptVerbs(HttpVerbs.Post)]
        public string PreveriVnose(FormCollection form)
        {
            int ocenaIzp;
            int ocena;
            string izhod = "";
            bool napaka = false;

            // preverim veljavnost vpisa ocene
            if (Int32.TryParse(form["ocenaIzpita"], out ocenaIzp))
            {
                if (!(ocenaIzp >= 1 && ocenaIzp <= 10))
                {
                    izhod = "Vnešena ocena mora biti med vključno 1 in 10.\n";
                    napaka = true;
                }
            }
            else
            {
                izhod = "Ocena mora biti številka med vključno 1 in 10.\n";
                napaka = true;
            }

            // preverim veljavnost vpisa ocene vaj
            if (form["bolonc"].Equals("stari") && form["ocenaVaj"] != null)
            {
                bool uspeh = Int32.TryParse(form["ocenaVaj"], out ocena);
                if (ocenaIzp <= 5 && uspeh && ocena != 0)
                {
                    izhod += "Če je ocena izpita 5 ali manj, mora biti ocena vaj 0!\n";
                    napaka = true;
                }
                else if (!uspeh && ocenaIzp <= 5)
                {
                }
                else
                {
                    if (uspeh)
                    {
                        if (!(ocena >= 0 && ocena <= 10))
                        {
                            izhod += "Vnešena ocena vaj mora biti med vključno 0 in 10.\n";
                            napaka = true;
                        }
                        else if(ocenaIzp > 5 && ocena <= 5){
                            izhod += "Vnešena ocena vaj mora biti pozitivna če je ocena izpita pozitivna.\n";
                            napaka = true;
                        }
                    }
                    else
                    {
                        izhod += "Ocena vaj mora biti številka med vključno 1 in 10.\n";
                        napaka = true;
                    }
                }
            }

            // preverim veljavnost datuma
            string bv = form["tekstRoki"];
            DateTime datum = DateTime.Today; // neka brezvezna vrednost
            try
            {
                datum = Convert.ToDateTime(bv);
            }
            catch (Exception e)
            {
                napaka = true;
                izhod += "Prišlo je do napake pri datumu. Datum ima obliko dd.mm.llll uu:mm:ss. Tehnične podrobnosti napake: " + e.Message + "\n";
            }
            if (datum > DateTime.Today)
            {
                napaka = true;
                izhod += "Datum je večji od današnjega";
            }

            if (!napaka)
                izhod = "ok";

            return izhod;
        }

        public ActionResult VnesiRok(FormCollection form)
        {
            DateTime datum;
            db = new estudentEnt();
            int idPouc = Int32.Parse(form["profesor"]);
            int sifraPred = Int32.Parse(form["predmet"]);
            string student = form["student"];
            int? ocenaIzp = null;
            int? ocenaVaj = null;
            int temp;

            ocenaIzp = Int32.Parse(form["ocenaIzpita"]);
            if (Int32.TryParse(form["ocenaVaj"], out temp) && form["bolonc"].Equals("stari"))
                ocenaVaj = Int32.Parse(form["ocenaVaj"]);

            // vpis studenta na katerega bomo vezali rok

            var vpis = from p in db.Vpisis
                       from r in p.sPredmetis
                       where p.username == student && r.sPredmeta == sifraPred
                       group p by p.idLetnikStudija into g
                       select new { leto = g.Max(p => p.letoVpisa) };

            var idVpisVec = from p in db.Vpisis
                            from r in p.sPredmetis
                            where p.username == student && r.sPredmeta == sifraPred && p.letoVpisa == vpis.FirstOrDefault().leto
                            select p;
            var idVpis = idVpisVec.FirstOrDefault();

            string bv = form["tekstRoki"];
            datum = Convert.ToDateTime(bv);

            // vpisovanje ocene in prijave, po potrebi še roka(skritega)
            var roki = db.IzpitniRokis
                .Where(p => p.idPoucuje == idPouc)
                .Where(p => p.datumRoka == datum)
                .FirstOrDefault();

            if (roki == null)
            {
                IzpitniRoki rok = new IzpitniRoki
                {
                    idPoucuje = idPouc,
                    datumRoka = datum,
                    skrit = true
                };

                try
                {
                    db.AddToIzpitniRokis(rok);
                    db.SaveChanges();
                }
                catch (Exception e)
                {
                    ViewData["uspeh"] = false;
                    ViewData["sporocilo"] = "Prišlo je do napake pri shranjevanju roka v bazo. Tehnične podrobnosti napake: " + e.Message;

                    return View("Rezultat");
                }
            }

            roki = db.IzpitniRokis
                .Where(p => p.idPoucuje == idPouc && p.datumRoka == datum)
                .FirstOrDefault();


            PrijaveNaIzpit prijava = new PrijaveNaIzpit
            {
                idVpisa = idVpis.idVpisa,
                idPoucuje = idPouc,
                datumRoka = datum,
                koncnaOcena = ocenaIzp,
                koncnaOcenaVaj = ocenaVaj
            };

            try
            {
                db.AddToPrijaveNaIzpits(prijava);
                db.SaveChanges();
            }
            catch (Exception e)
            {
                ViewData["uspeh"] = false;
                ViewData["sporocilo"] = "Prišlo je do napake pri shranjevanju prijave v bazo. Tehnične podrobnosti napake: " + e.Message;

                return View("Rezultat");
            }

            ViewData["uspeh"] = true;
            ViewData["sporocilo"] = "Vnos uspešno shranjen.";

            return View("Rezultat");
        }

        [AcceptVerbs(HttpVerbs.Post)]
        public string PoisciRoke(FormCollection form)
        {
            db = new estudentEnt();

            int idPouc = Int32.Parse(form["profesor"]);
            int sifraPred = Int32.Parse(form["predmet"]);

            var roki = db.IzpitniRokis
                .Where(p => p.idPoucuje == idPouc)
                .Where(p => p.datumRoka <= DateTime.Today)
                .OrderByDescending(p => p.datumRoka);


            string izhod = "<option value=\"prazen\">Izberite rok</option>";
            foreach (var ele in roki)
            {
                izhod += ("<option value=\"" + ele.datumRoka + "\">" + String.Format("{0:dd.MM.yyyy}", ele.datumRoka) + "</option>");
            }
            return izhod;
        }

        [AcceptVerbs(HttpVerbs.Post)]
        public string PreveriBolon(FormCollection form)
        {
            db = new estudentEnt();
            int idPouc = Int32.Parse(form["profesor"]);
            int idPred = Int32.Parse(form["predmet"]);
            IEnumerable<Poucuje> predmet = null;

            if (form["prof"] == null)
            {
                predmet = db.Poucujes
                    .Where(p => p.idPoucuje == idPouc);
            }
            else
            {
                predmet = db.Poucujes
                    .Where(p => p.sProfesor1 == idPouc || p.sProfesor2 == idPouc || p.sProfesor3 == idPouc)
                    .Where(p => p.sPredmeta == idPred);
            }

            var bolon = from p in db.Vpisis
                        from r in p.sPredmetis
                        where r.sPredmeta == predmet.FirstOrDefault().sPredmeta
                        select p;

            if (bolon.Any(p => p.sSmer.StartsWith("X") || p.sSmer.StartsWith("V")))
                return "bolon";
            else
                return "stari";


        }

        [AcceptVerbs(HttpVerbs.Post)]
        public string PoisciIzvaj(FormCollection form)
        {
            db = new estudentEnt();
            string izhod = "";
            int sprof = Int32.Parse(form["sProf"]);
            int pred = Int32.Parse(form["predmet"]);

            var izvaj = db.Poucujes
                .Where(p => p.sPredmeta == pred)
                .Where(p => p.sProfesor1 == sprof || p.sProfesor2 == sprof || p.sProfesor3 == sprof)
                .OrderBy(p => p.sProfesor1)
                .ThenBy(p => p.sProfesor2)
                .ThenBy(p => p.sProfesor3);

            foreach (var ele in izvaj)
            {
                izhod += "<option value='" + ele.idPoucuje + "'>" + ele.SProfesorji1.priimekProfesor + " " + ele.SProfesorji1.imeProfesor;
                if (ele.sProfesor2 != null)
                {
                    izhod += ", " + ele.SProfesorji2.priimekProfesor + " " + ele.SProfesorji2.priimekProfesor;
                }
                if (ele.sProfesor3 != null)
                {
                    izhod += ", " + ele.SProfesorji.priimekProfesor + " " + ele.SProfesorji.priimekProfesor;
                }
                izhod += "</option>";
            }
            return izhod;
        }

    }
}
